package main

import (
	"fmt"
	"reflect"
)

func main() {
	// a,b 是一个值
	a := 5
	b := 6

	fmt.Println("a的值：", a)

	// 指针变量 c 存储的是变量 a 的内存地址
	c := &a
	fmt.Println("a的内存地址：", c)

	// 指针变量不允许直接赋值，需要使用 * 获取引用
	//c = 4

	// 将指针变量 c 指向的内存里面的值设置为4
	*c = 4
	fmt.Println("a的值：", a)

	// 指针变量 c 现在存储的是变量 b 的内存地址
	c = &b
	fmt.Println("b的内存地址：", c)

	// 将指针变量 c 指向的内存里面的值设置为4
	*c = 8
	fmt.Println("a的值：", a)
	fmt.Println("b的值：", b)

	// 把指针变量 c 赋予 c1, c1 是一个引用变量，存的只是指针地址，他们两个现在是独立的了
	c1 := c
	fmt.Println("c的内存地址：", c)
	fmt.Println("c1的内存地址：", c1)

	// 将指针变量 c 指向的内存里面的值设置为4
	*c = 9
	fmt.Println("c指向的内存地址的值", *c)
	fmt.Println("c1指向的内存地址的值", *c1)

	// 指针变量 c 现在存储的是变量 a 的内存地址，但 c1 还是不变
	c = &a
	fmt.Println("c的内存地址：", c)
	fmt.Println("c1的内存地址：", c1)

	fmt.Println("=============")
	diy := Diy{}
	// diy := &Diy{}
	fmt.Printf("typeOf:%v\n", reflect.TypeOf(diy))
	fmt.Printf("kind:%v\n", reflect.TypeOf(diy).Kind())
	fmt.Printf("name:%v\n", reflect.TypeOf(diy).Name())
}

// 结构体
type Diy struct {
	A int64   // 大写导出成员
	b float64 // 小写不可以导出
}

// 引用结构体的方法，引用传递，会改变原有结构体的值
func (diy *Diy) Set(a int64, b float64) {
	diy.A = a
	diy.b = b
	return
}

// 值结构体的方法，值传递，不会改变原有结构体的值
func (diy Diy) Set2(a int64, b float64) {
	diy.A = a
	diy.b = b
	return
}
